years <- seq(2014, 2019)
#years <- seq(2014, 2020)
forprofit_counts <- profit_states_1419 %>%
dplyr::select(contains("count_Forprofit_")) %>%
summarize(across(everything(), sum, na.rm = TRUE))
Warning: There was 1 warning in `summarize()`.
ℹ In argument: `across(everything(), sum, na.rm = TRUE)`.
Caused by warning:
! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
Supply arguments directly to `.fns` through an anonymous function instead.
# Previously
across(a:b, mean, na.rm = TRUE)
# Now
across(a:b, \(x) mean(x, na.rm = TRUE))
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
nonprofit_counts <- profit_states_1419 %>%
dplyr::select(contains("count_Nonprofit_")) %>%
summarize(across(everything(), sum, na.rm = TRUE))
govt_counts <- profit_states_1419 %>%
dplyr::select(contains("count_Government_")) %>%
summarize(across(everything(), sum, na.rm = TRUE))
plot(years, forprofit_counts, type = 'l', main= "Treatment Facility Counts over time", ylim = c(1000, 8000), col = 'blue', xlab = 'Year', ylab = '# Treatment Centers')
lines(years, nonprofit_counts, type = 'l', main= "Non Profit Counts", col = 'red')
lines(years, govt_counts, type = 'l', main= "Government Counts", col = 'green')
legend("bottomleft", c("for profit", "non profit", "government"), col = c("blue", "red", "green"), pch ='-', lwd = 2)

using map tutorial from: https://jtr13.github.io/cc19/different-ways-of-plotting-u-s-map-in-r.html#using-ggplot2-package
state abbreviations from: https://www.ssa.gov/international/coc-docs/states.html
library(ggplot2)
library(maps)
Attaching package: ‘maps’
The following object is masked from ‘package:purrr’:
map
library(mapdata)
library(plotly)
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
Attaching package: ‘plotly’
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
library(sf)
Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
usa <- map_data('usa')
state <- map_data("state")
#merge state geo file to the for-profit information
state <- state %>%
left_join(state_abbrevs_df, by = c("region" = "state_names")) %>%
left_join(profit_states_1419, by = c('state_abbrevs' = 'STATE'))
#plot the number of for-profit treatment centers from 2015-2019
for (i in seq(2015, 2019))
{
plot_forprofits <- ggplot(data=state, aes(x=long, y=lat, fill= !!sym(paste0("count_Forprofit_", i, sep = "")), group=group)) +
scale_fill_gradient(low = "grey", high = "green", limits = c(0,800)) +
geom_polygon(color = "white") +
ggtitle(paste('# For-Profit Treatment Centers in', i)) +
coord_fixed(1.3)
print(plot_forprofits)
}





ggplot(data=state, aes(x=long, y=lat, fill= change_Forprofit_1519, group=group)) +
scale_fill_gradient(low = "grey", high = "green", limits = c(0,400)) +
geom_polygon(color = "white") +
ggtitle('Change in # For-Profit Treatment Centers from 2015 - 2019') +
coord_fixed(1.3)

for (i in seq(2015, 2019))
{
plot_nonprofits <- ggplot(data=state, aes(x=long, y=lat, fill= !!sym(paste0("count_Nonprofit_", i, sep = "")), group=group)) +
scale_fill_gradient(low = "grey", high = "blue", limits = c(0,900)) +
geom_polygon(color = "white") +
ggtitle(paste('# Non-Profit Treatment Centers in', i)) +
coord_fixed(1.3)
print(plot_nonprofits)
}





ggplot(data=state, aes(x=long, y=lat, fill= change_Nonprofit_1519, group=group)) +
scale_fill_gradient(low = "grey", high = "blue", limits = c(0,100)) +
geom_polygon(color = "white") +
ggtitle('Change in # Non-Profit Treatment Centers from 2015 - 2019') +
coord_fixed(1.3)

for (i in seq(2015, 2019))
{
plot_govt <- ggplot(data=state, aes(x=long, y=lat, fill= !!sym(paste0("count_Government_", i, sep = "")), group=group)) +
scale_fill_gradient(low = "grey", high = "red", limits = c(0,250)) +
geom_polygon(color = "white") +
ggtitle(paste('# Government Treatment Centers in', i)) +
coord_fixed(1.3)
print(plot_govt)
}





ggplot(data=state, aes(x=long, y=lat, fill= change_Government_1519, group=group)) +
scale_fill_gradient(low = "grey", high = "red", limits = c(0,50)) +
geom_polygon(color = "white") +
ggtitle('Change in # Government Treatment Centers from 2015 - 2019') +
coord_fixed(1.3)

# state_name <- "California"
#
# par(mar=c(5, 4, 4, 12), xpd=TRUE)
#
# plot(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "UDPYILAL", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "UDPYILAL", ]$est_total, type = 'o', ylim= c(0,10000), main = paste(state, "Substance Use Measures Over Time") ,xlab = "year", ylab = "Thousands of People in 2015-18")
#
# lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "ILLEMMON", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "ILLEMMON", ]$est_total, col = 'blue', type = 'o')
#
# lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "BNGDRK", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "BNGDRK", ]$est_total, col = 'red', type = 'o')
#
# lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "TXNPILAL", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "TXNPILAL", ]$est_total, col = 'green', type = 'o')
#
# lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "PNRNMYR", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "PNRNMYR", ]$est_total, col = 'purple', type = 'o')
#
# legend('topright',legend = c("Substance Use Disorder", "Drug use in past month", "Binge alcohol use", "Needing, not receiving tx", "pain reliever misuse"), col = c("black", "blue", "red", "green", "purple"), lty = 1, inset=c(-0.5, 0))
plot(state_final_df[state_final_df$profit_type == "Forprofit", ]$sud, state_final_df[state_final_df$profit_type == "Forprofit",]$tx_percapita, xlab = "Substance Use Disorder Counts (in thousands)", ylab = "For profit treatment centers per capita")
abline(lm(tx_percapita ~ sud, data = state_final_df[state_final_df$profit_type == "Forprofit", ]))

plot(state_final_df[state_final_df$profit_type == "Nonprofit", ]$sud, state_final_df[state_final_df$profit_type == "Nonprofit",]$tx_percapita, col = "blue", xlab = "Substance Use Disorder counts (in thousands) ", ylab = "Nonprofit treatment centers per capita")
abline(lm(tx_percapita ~ sud, data = state_final_df[state_final_df$profit_type == "Nonprofit", ]))

plot(state_final_df[state_final_df$profit_type == "Government", ]$sud, state_final_df[state_final_df$profit_type == "Government",]$tx_percapita, col = "green", xlab = "Substance Use Disorder counts (in thousands)", ylab = "Government treatment centers per capita")
abline(lm(tx_percapita ~ sud, data = state_final_df[state_final_df$profit_type == "Government", ]))

NA
NA
Look at the distribution of each input variable of interest at each
point in time
create_hist <- function(df, year_param, profit_param, col_param)
{
subset_data <- df %>%
filter(year == year_param, profit_type == profit_param)
hist(subset_data[[col_param]], main = paste("Histogram of ",year_param, profit_param, col_param), xlab = col_param)
}
#substance use measures are roughly normal
create_hist(state_final_df, 2016, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2017, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2018, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2019, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2016, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2017, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2018, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2019, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2016, "Forprofit", "needing_tx")

create_hist(state_final_df, 2017, "Forprofit", "needing_tx")

create_hist(state_final_df, 2018, "Forprofit", "needing_tx")

create_hist(state_final_df, 2019, "Forprofit", "needing_tx")

create_hist(state_final_df, 2016, "Forprofit", "sud")

create_hist(state_final_df, 2017, "Forprofit", "sud")

create_hist(state_final_df, 2018, "Forprofit", "sud")

create_hist(state_final_df, 2019, "Forprofit", "sud")

#for profit treatment centers are heavily skewed for all years
create_hist(state_final_df, 2016, "Forprofit", "count_tx")

create_hist(state_final_df, 2017, "Forprofit", "count_tx")

create_hist(state_final_df, 2018, "Forprofit", "count_tx")

create_hist(state_final_df, 2019, "Forprofit", "count_tx")

#non profit treatment centers are heavily skewed for all years
create_hist(state_final_df, 2016, "Nonprofit", "count_tx")

create_hist(state_final_df, 2017, "Nonprofit", "count_tx")

create_hist(state_final_df, 2018, "Nonprofit", "count_tx")

create_hist(state_final_df, 2019, "Nonprofit", "count_tx")

#government treatment centers are heavily skewed for all years
create_hist(state_final_df, 2016, "Government", "count_tx")

create_hist(state_final_df, 2017, "Government", "count_tx")

create_hist(state_final_df, 2018, "Government", "count_tx")

create_hist(state_final_df, 2019, "Government", "count_tx")

Investigating treatment centers per capita over time and by profit
status
forprofit_txpercapita <- state_final_df %>%
filter(profit_type == "Forprofit") %>%
group_by(year) %>%
summarize(avg_tx_percapita = mean(tx_percapita, na.rm = TRUE),
min_tx_percapita = min(tx_percapita, na.rm = TRUE),
max_tx_percapita = max(tx_percapita, na.rm = TRUE))
nonprofit_txpercapita <- state_final_df %>%
filter(profit_type == "Nonprofit") %>%
group_by(year) %>%
summarize(avg_tx_percapita = mean(tx_percapita, na.rm = TRUE),
min_tx_percapita = min(tx_percapita, na.rm = TRUE),
max_tx_percapita = max(tx_percapita, na.rm = TRUE))
govt_txpercapita <- state_final_df %>%
filter(profit_type == "Government") %>%
group_by(year) %>%
summarize(avg_tx_percapita = mean(tx_percapita, na.rm = TRUE),
min_tx_percapita = min(tx_percapita, na.rm = TRUE),
max_tx_percapita = max(tx_percapita, na.rm = TRUE))
plot(forprofit_txpercapita$year, forprofit_txpercapita$avg_tx_percapita, type = 'o', col = 'blue', ylim = c(0.000001, 0.00005))
#lines(forprofit_txpercapita$year, forprofit_txpercapita$min_tx_percapita, type = 'l', col = 'blue', lty = 2)
#lines(forprofit_txpercapita$year, forprofit_txpercapita$max_tx_percapita, type = 'l', col = 'blue', lty = 2)
lines(nonprofit_txpercapita$year, nonprofit_txpercapita$avg_tx_percapita, type = 'o', col = 'red' )
#lines(nonprofit_txpercapita$year, nonprofit_txpercapita$min_tx_percapita, type = 'l', col = 'red', lty = 2 )
#lines(nonprofit_txpercapita$year, nonprofit_txpercapita$max_tx_percapita, type = 'l', col = 'red', lty = 2 )
lines(govt_txpercapita$year, govt_txpercapita$avg_tx_percapita, type = 'o', col = 'green')

#lines(govt_txpercapita$year, govt_txpercapita$min_tx_percapita, type = 'l', col = 'green', lty = 2)
#lines(govt_txpercapita$year, govt_txpercapita$max_tx_percapita, type = 'l', col = 'green', lty = 2)
state_final_df[is.na(state_final_df$tx_percapita),]
#Connecticut, South Carolina, Ohio, Mississippi, New York have the fewest for-profit treatment centers per capita
#Maine, Idaho, Utah, North Dakota, Kentucky have the most for-profit treatment centers per capita
state_final_df %>%
group_by(State_Abbrev, profit_type) %>%
summarize(avg_txpercapita = mean(tx_percapita, na.rm = TRUE)) %>%
filter(profit_type == "Forprofit") %>%
arrange(avg_txpercapita) %>%
ungroup() %>%
left_join(state, by = c("State_Abbrev" = "state_abbrevs")) %>%
ggplot(aes(x=long, y=lat, fill= avg_txpercapita, group=group)) +
scale_fill_gradient(low = "grey", high = "green", limits = c(0,0.0001)) +
geom_polygon(color = "white") +
ggtitle('Average Nonprofit Treatment Centers per capita 2015-2019') +
coord_fixed(1.3)
`summarise()` has grouped output by 'State_Abbrev'. You can override using the `.groups` argument.

#Virginia, Texas, Idaho, South Carolina, Georgia have the fewest non-profit treatment centers per capita
#Hawaii, Alaska, Maine, Vermont, Wyoming have the most non-profit treatment centers per capita
state_final_df %>%
group_by(State_Abbrev, profit_type) %>%
summarize(avg_txpercapita = mean(tx_percapita, na.rm = TRUE)) %>%
filter(profit_type == "Nonprofit") %>%
arrange(avg_txpercapita) %>%
ungroup() %>%
left_join(state, by = c("State_Abbrev" = "state_abbrevs")) %>%
ggplot(aes(x=long, y=lat, fill= avg_txpercapita, group=group)) +
scale_fill_gradient(low = "grey", high = "blue", limits = c(0,0.0001)) +
geom_polygon(color = "white") +
ggtitle('Average Nonprofit Treatment Centers per capita 2015-2019') +
coord_fixed(1.3)
`summarise()` has grouped output by 'State_Abbrev'. You can override using the `.groups` argument.

#New Hampshire, Tennessee, Pennsylvania, Delaware, Kentucky have the fewest government treatment centers per capita
#Alaska, North Dakota, South Dakota, Wyoming, New Mexico have the most government treatment centers per capita
state_final_df %>%
group_by(State_Abbrev, profit_type) %>%
summarize(avg_txpercapita = mean(tx_percapita, na.rm = TRUE)) %>%
filter(profit_type == "Government") %>%
arrange(avg_txpercapita) %>%
ungroup() %>%
left_join(state, by = c("State_Abbrev" = "state_abbrevs")) %>%
ggplot(aes(x=long, y=lat, fill= avg_txpercapita, group=group)) +
scale_fill_gradient(low = "grey", high = "red", limits = c(0,0.00005)) +
geom_polygon(color = "white") +
ggtitle('Average government Treatment Centers per capita 2015-2019') +
coord_fixed(1.3)
`summarise()` has grouped output by 'State_Abbrev'. You can override using the `.groups` argument.

state_final_df %>%
group_by(State_Name, profit_type) %>%
pivot_wider(id_cols = c(State_Name, profit_type), names_from = year, values_from = count_tx, names_prefix = "yr") %>%
mutate(change_2016_17 = yr2017 - yr2016,
change_2017_18 = yr2018 - yr2017,
change_2018_19 = yr2019 - yr2018,
total_change = yr2019 - yr2017)
#mutate(increase = ifelse())
state_yearly_averages<- state_final_df %>%
distinct(State_Abbrev, profit_type, year, .keep_all = TRUE) %>%
group_by(year) %>%
summarize(avg_druguse = mean(illicit_druguse),
avg_drinking = mean(binge_drinking),
avg_od = mean(RATE)) %>%
arrange(year)
plot(state_yearly_averages$year, state_yearly_averages$avg_druguse, type = 'l')

plot(state_yearly_averages$year, state_yearly_averages$avg_drinking, type = 'l')

plot(state_yearly_averages$avg_od, state_yearly_averages$avg_od, type = 'l')

LS0tCnRpdGxlOiAiU0FNSFNBIE5TU0FUUyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7cn0KCnllYXJzIDwtIHNlcSgyMDE0LCAyMDE5KSAKI3llYXJzIDwtIHNlcSgyMDE0LCAyMDIwKQpmb3Jwcm9maXRfY291bnRzIDwtIHByb2ZpdF9zdGF0ZXNfMTQxOSAlPiUgCiAgZHBseXI6OnNlbGVjdChjb250YWlucygiY291bnRfRm9ycHJvZml0XyIpKSAlPiUgCiAgc3VtbWFyaXplKGFjcm9zcyhldmVyeXRoaW5nKCksIHN1bSwgbmEucm0gPSBUUlVFKSkKCm5vbnByb2ZpdF9jb3VudHMgPC0gcHJvZml0X3N0YXRlc18xNDE5ICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvbnRhaW5zKCJjb3VudF9Ob25wcm9maXRfIikpICU+JSAKICBzdW1tYXJpemUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgc3VtLCBuYS5ybSA9IFRSVUUpKQoKZ292dF9jb3VudHMgPC0gcHJvZml0X3N0YXRlc18xNDE5ICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvbnRhaW5zKCJjb3VudF9Hb3Zlcm5tZW50XyIpKSAlPiUgCiAgc3VtbWFyaXplKGFjcm9zcyhldmVyeXRoaW5nKCksIHN1bSwgbmEucm0gPSBUUlVFKSkKCgpwbG90KHllYXJzLCBmb3Jwcm9maXRfY291bnRzLCB0eXBlID0gJ2wnLCBtYWluPSAiVHJlYXRtZW50IEZhY2lsaXR5IENvdW50cyBvdmVyIHRpbWUiLCB5bGltID0gYygxMDAwLCA4MDAwKSwgY29sID0gJ2JsdWUnLCB4bGFiID0gJ1llYXInLCB5bGFiID0gJyMgVHJlYXRtZW50IENlbnRlcnMnKQpsaW5lcyh5ZWFycywgbm9ucHJvZml0X2NvdW50cywgdHlwZSA9ICdsJywgbWFpbj0gIk5vbiBQcm9maXQgQ291bnRzIiwgY29sID0gJ3JlZCcpCmxpbmVzKHllYXJzLCBnb3Z0X2NvdW50cywgdHlwZSA9ICdsJywgbWFpbj0gIkdvdmVybm1lbnQgQ291bnRzIiwgY29sID0gJ2dyZWVuJykKCmxlZ2VuZCgiYm90dG9tbGVmdCIsIGMoImZvciBwcm9maXQiLCAibm9uIHByb2ZpdCIsICJnb3Zlcm5tZW50IiksIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiksIHBjaCA9Jy0nLCBsd2QgPSAyKQoKYGBgCgoKdXNpbmcgbWFwIHR1dG9yaWFsIGZyb206IGh0dHBzOi8vanRyMTMuZ2l0aHViLmlvL2NjMTkvZGlmZmVyZW50LXdheXMtb2YtcGxvdHRpbmctdS1zLW1hcC1pbi1yLmh0bWwjdXNpbmctZ2dwbG90Mi1wYWNrYWdlCnN0YXRlIGFiYnJldmlhdGlvbnMgZnJvbTogaHR0cHM6Ly93d3cuc3NhLmdvdi9pbnRlcm5hdGlvbmFsL2NvYy1kb2NzL3N0YXRlcy5odG1sCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkobWFwZGF0YSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoc2YpCgp1c2EgPC0gbWFwX2RhdGEoJ3VzYScpCnN0YXRlIDwtIG1hcF9kYXRhKCJzdGF0ZSIpCgojbWVyZ2Ugc3RhdGUgZ2VvIGZpbGUgdG8gdGhlIGZvci1wcm9maXQgaW5mb3JtYXRpb24Kc3RhdGUgPC0gc3RhdGUgJT4lIAogICAgICAgICAgICAgIGxlZnRfam9pbihzdGF0ZV9hYmJyZXZzX2RmLCBieSA9IGMoInJlZ2lvbiIgPSAic3RhdGVfbmFtZXMiKSkgJT4lIAogICAgICAgICAgICAgIGxlZnRfam9pbihwcm9maXRfc3RhdGVzXzE0MTksIGJ5ID0gYygnc3RhdGVfYWJicmV2cycgPSAnU1RBVEUnKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYAoKCgoKYGBge3J9CiNwbG90IHRoZSBudW1iZXIgb2YgZm9yLXByb2ZpdCB0cmVhdG1lbnQgY2VudGVycyBmcm9tIDIwMTUtMjAxOQpmb3IgKGkgaW4gc2VxKDIwMTUsIDIwMTkpKQp7CiAgcGxvdF9mb3Jwcm9maXRzIDwtIGdncGxvdChkYXRhPXN0YXRlLCBhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gISFzeW0ocGFzdGUwKCJjb3VudF9Gb3Jwcm9maXRfIiwgaSwgc2VwID0gIiIpKSwgZ3JvdXA9Z3JvdXApKSArIAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleSIsIGhpZ2ggPSAiZ3JlZW4iLCBsaW1pdHMgPSBjKDAsODAwKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUocGFzdGUoJyMgRm9yLVByb2ZpdCBUcmVhdG1lbnQgQ2VudGVycyBpbicsIGkpKSArIAogICAgICAgICAgICAgICAgICAgICAgY29vcmRfZml4ZWQoMS4zKQogIHByaW50KHBsb3RfZm9ycHJvZml0cykKfQoKCmdncGxvdChkYXRhPXN0YXRlLCBhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gY2hhbmdlX0ZvcnByb2ZpdF8xNTE5LCBncm91cD1ncm91cCkpICsgCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmV5IiwgaGlnaCA9ICJncmVlbiIsIGxpbWl0cyA9IGMoMCw0MDApKSArCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvbHlnb24oY29sb3IgPSAid2hpdGUiKSArIAogICAgICAgICAgICAgICAgICAgICAgZ2d0aXRsZSgnQ2hhbmdlIGluICMgRm9yLVByb2ZpdCBUcmVhdG1lbnQgQ2VudGVycyBmcm9tIDIwMTUgLSAyMDE5JykgKyAKICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKDEuMykKCmBgYAoKCmBgYHtyfQpmb3IgKGkgaW4gc2VxKDIwMTUsIDIwMTkpKQp7CiAgcGxvdF9ub25wcm9maXRzIDwtIGdncGxvdChkYXRhPXN0YXRlLCBhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gISFzeW0ocGFzdGUwKCJjb3VudF9Ob25wcm9maXRfIiwgaSwgc2VwID0gIiIpKSwgZ3JvdXA9Z3JvdXApKSArIAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleSIsIGhpZ2ggPSAiYmx1ZSIsIGxpbWl0cyA9IGMoMCw5MDApKSArCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvbHlnb24oY29sb3IgPSAid2hpdGUiKSArIAogICAgICAgICAgICAgICAgICAgICAgZ2d0aXRsZShwYXN0ZSgnIyBOb24tUHJvZml0IFRyZWF0bWVudCBDZW50ZXJzIGluJywgaSkpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCiAgcHJpbnQocGxvdF9ub25wcm9maXRzKQp9CgoKZ2dwbG90KGRhdGE9c3RhdGUsIGFlcyh4PWxvbmcsIHk9bGF0LCBmaWxsPSBjaGFuZ2VfTm9ucHJvZml0XzE1MTksIGdyb3VwPWdyb3VwKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZXkiLCBoaWdoID0gImJsdWUiLCBsaW1pdHMgPSBjKDAsMTAwKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUoJ0NoYW5nZSBpbiAjIE5vbi1Qcm9maXQgVHJlYXRtZW50IENlbnRlcnMgZnJvbSAyMDE1IC0gMjAxOScpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCmBgYAoKYGBge3J9CmZvciAoaSBpbiBzZXEoMjAxNSwgMjAxOSkpCnsKICBwbG90X2dvdnQgPC0gZ2dwbG90KGRhdGE9c3RhdGUsIGFlcyh4PWxvbmcsIHk9bGF0LCBmaWxsPSAhIXN5bShwYXN0ZTAoImNvdW50X0dvdmVybm1lbnRfIiwgaSwgc2VwID0gIiIpKSwgZ3JvdXA9Z3JvdXApKSArIAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleSIsIGhpZ2ggPSAicmVkIiwgbGltaXRzID0gYygwLDI1MCkpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9seWdvbihjb2xvciA9ICJ3aGl0ZSIpICsgCiAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKHBhc3RlKCcjIEdvdmVybm1lbnQgVHJlYXRtZW50IENlbnRlcnMgaW4nLCBpKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKDEuMykKICBwcmludChwbG90X2dvdnQpCn0KCgoKZ2dwbG90KGRhdGE9c3RhdGUsIGFlcyh4PWxvbmcsIHk9bGF0LCBmaWxsPSBjaGFuZ2VfR292ZXJubWVudF8xNTE5LCBncm91cD1ncm91cCkpICsgCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmV5IiwgaGlnaCA9ICJyZWQiLCBsaW1pdHMgPSBjKDAsNTApKSArCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvbHlnb24oY29sb3IgPSAid2hpdGUiKSArIAogICAgICAgICAgICAgICAgICAgICAgZ2d0aXRsZSgnQ2hhbmdlIGluICMgR292ZXJubWVudCBUcmVhdG1lbnQgQ2VudGVycyBmcm9tIDIwMTUgLSAyMDE5JykgKyAKICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKDEuMykKYGBgCgoKCmBgYHtyfQoKIyBzdGF0ZV9uYW1lIDwtICJDYWxpZm9ybmlhIgojIAojIHBhcihtYXI9Yyg1LCA0LCA0LCAxMiksIHhwZD1UUlVFKQojIAojIHBsb3QoeWVhcmx5X25zZHVoX2RhdGFbeWVhcmx5X25zZHVoX2RhdGEkc3RuYW1lID09IHN0YXRlICYgeWVhcmx5X25zZHVoX2RhdGEkb3V0Y29tZSA9PSAiVURQWUlMQUwiLCBdJHN0YXJ0X3llYXIsIHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIlVEUFlJTEFMIiwgXSRlc3RfdG90YWwsIHR5cGUgPSAnbycsIHlsaW09IGMoMCwxMDAwMCksIG1haW4gPSBwYXN0ZShzdGF0ZSwgIlN1YnN0YW5jZSBVc2UgTWVhc3VyZXMgT3ZlciBUaW1lIikgLHhsYWIgPSAieWVhciIsIHlsYWIgPSAiVGhvdXNhbmRzIG9mIFBlb3BsZSBpbiAyMDE1LTE4IikKIyAKIyBsaW5lcyh5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJJTExFTU1PTiIsIF0kc3RhcnRfeWVhciwgeWVhcmx5X25zZHVoX2RhdGFbeWVhcmx5X25zZHVoX2RhdGEkc3RuYW1lID09IHN0YXRlICYgeWVhcmx5X25zZHVoX2RhdGEkb3V0Y29tZSA9PSAiSUxMRU1NT04iLCBdJGVzdF90b3RhbCwgY29sID0gJ2JsdWUnLCB0eXBlID0gJ28nKQojIAojIGxpbmVzKHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIkJOR0RSSyIsIF0kc3RhcnRfeWVhciwgeWVhcmx5X25zZHVoX2RhdGFbeWVhcmx5X25zZHVoX2RhdGEkc3RuYW1lID09IHN0YXRlICYgeWVhcmx5X25zZHVoX2RhdGEkb3V0Y29tZSA9PSAiQk5HRFJLIiwgXSRlc3RfdG90YWwsIGNvbCA9ICdyZWQnLCB0eXBlID0gJ28nKQojIAojIGxpbmVzKHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIlRYTlBJTEFMIiwgXSRzdGFydF95ZWFyLCB5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJUWE5QSUxBTCIsIF0kZXN0X3RvdGFsLCBjb2wgPSAnZ3JlZW4nLCB0eXBlID0gJ28nKQojIAojIGxpbmVzKHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIlBOUk5NWVIiLCBdJHN0YXJ0X3llYXIsIHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIlBOUk5NWVIiLCBdJGVzdF90b3RhbCwgY29sID0gJ3B1cnBsZScsIHR5cGUgPSAnbycpCiMgCiMgbGVnZW5kKCd0b3ByaWdodCcsbGVnZW5kID0gYygiU3Vic3RhbmNlIFVzZSBEaXNvcmRlciIsICJEcnVnIHVzZSBpbiBwYXN0IG1vbnRoIiwgIkJpbmdlIGFsY29ob2wgdXNlIiwgIk5lZWRpbmcsIG5vdCByZWNlaXZpbmcgdHgiLCAicGFpbiByZWxpZXZlciBtaXN1c2UiKSwgY29sID0gYygiYmxhY2siLCAiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iLCAicHVycGxlIiksIGx0eSA9IDEsICBpbnNldD1jKC0wLjUsIDApKQoKYGBgCgoKYGBge3J9CgpwbG90KHN0YXRlX2ZpbmFsX2RmW3N0YXRlX2ZpbmFsX2RmJHByb2ZpdF90eXBlID09ICJGb3Jwcm9maXQiLCBdJHN1ZCwgc3RhdGVfZmluYWxfZGZbc3RhdGVfZmluYWxfZGYkcHJvZml0X3R5cGUgPT0gIkZvcnByb2ZpdCIsXSR0eF9wZXJjYXBpdGEsIHhsYWIgPSAiU3Vic3RhbmNlIFVzZSBEaXNvcmRlciBDb3VudHMgKGluIHRob3VzYW5kcykiLCB5bGFiID0gIkZvciBwcm9maXQgdHJlYXRtZW50IGNlbnRlcnMgcGVyIGNhcGl0YSIpCmFibGluZShsbSh0eF9wZXJjYXBpdGEgfiBzdWQsIGRhdGEgPSBzdGF0ZV9maW5hbF9kZltzdGF0ZV9maW5hbF9kZiRwcm9maXRfdHlwZSA9PSAiRm9ycHJvZml0IiwgXSkpCgoKcGxvdChzdGF0ZV9maW5hbF9kZltzdGF0ZV9maW5hbF9kZiRwcm9maXRfdHlwZSA9PSAiTm9ucHJvZml0IiwgXSRzdWQsIHN0YXRlX2ZpbmFsX2RmW3N0YXRlX2ZpbmFsX2RmJHByb2ZpdF90eXBlID09ICJOb25wcm9maXQiLF0kdHhfcGVyY2FwaXRhLCBjb2wgPSAiYmx1ZSIsIHhsYWIgPSAiU3Vic3RhbmNlIFVzZSBEaXNvcmRlciBjb3VudHMgKGluIHRob3VzYW5kcykgIiwgeWxhYiA9ICJOb25wcm9maXQgdHJlYXRtZW50IGNlbnRlcnMgcGVyIGNhcGl0YSIpCmFibGluZShsbSh0eF9wZXJjYXBpdGEgfiBzdWQsIGRhdGEgPSBzdGF0ZV9maW5hbF9kZltzdGF0ZV9maW5hbF9kZiRwcm9maXRfdHlwZSA9PSAiTm9ucHJvZml0IiwgXSkpCgpwbG90KHN0YXRlX2ZpbmFsX2RmW3N0YXRlX2ZpbmFsX2RmJHByb2ZpdF90eXBlID09ICJHb3Zlcm5tZW50IiwgXSRzdWQsIHN0YXRlX2ZpbmFsX2RmW3N0YXRlX2ZpbmFsX2RmJHByb2ZpdF90eXBlID09ICJHb3Zlcm5tZW50IixdJHR4X3BlcmNhcGl0YSwgY29sID0gImdyZWVuIiwgeGxhYiA9ICJTdWJzdGFuY2UgVXNlIERpc29yZGVyIGNvdW50cyAoaW4gdGhvdXNhbmRzKSIsIHlsYWIgPSAiR292ZXJubWVudCB0cmVhdG1lbnQgY2VudGVycyBwZXIgY2FwaXRhIikKYWJsaW5lKGxtKHR4X3BlcmNhcGl0YSB+IHN1ZCwgZGF0YSA9IHN0YXRlX2ZpbmFsX2RmW3N0YXRlX2ZpbmFsX2RmJHByb2ZpdF90eXBlID09ICJHb3Zlcm5tZW50IiwgXSkpCgoKYGBgCgoKCkxvb2sgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBlYWNoIGlucHV0IHZhcmlhYmxlIG9mIGludGVyZXN0IGF0IGVhY2ggcG9pbnQgaW4gdGltZQpgYGB7cn0KCmNyZWF0ZV9oaXN0IDwtIGZ1bmN0aW9uKGRmLCB5ZWFyX3BhcmFtLCBwcm9maXRfcGFyYW0sIGNvbF9wYXJhbSkKewogIHN1YnNldF9kYXRhIDwtIGRmICU+JQogIGZpbHRlcih5ZWFyID09IHllYXJfcGFyYW0sIHByb2ZpdF90eXBlID09IHByb2ZpdF9wYXJhbSkKICBoaXN0KHN1YnNldF9kYXRhW1tjb2xfcGFyYW1dXSwgbWFpbiA9IHBhc3RlKCJIaXN0b2dyYW0gb2YgIix5ZWFyX3BhcmFtLCBwcm9maXRfcGFyYW0sIGNvbF9wYXJhbSksIHhsYWIgPSBjb2xfcGFyYW0pCn0KCmBgYAoKYGBge3J9Cgojc3Vic3RhbmNlIHVzZSBtZWFzdXJlcyBhcmUgcm91Z2hseSBub3JtYWwKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTYsICJGb3Jwcm9maXQiLCAiYmluZ2VfZHJpbmtpbmciKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNywgIkZvcnByb2ZpdCIsICJiaW5nZV9kcmlua2luZyIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE4LCAiRm9ycHJvZml0IiwgImJpbmdlX2RyaW5raW5nIikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTksICJGb3Jwcm9maXQiLCAiYmluZ2VfZHJpbmtpbmciKQoKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTYsICJGb3Jwcm9maXQiLCAiaWxsaWNpdF9kcnVndXNlIikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTcsICJGb3Jwcm9maXQiLCAiaWxsaWNpdF9kcnVndXNlIikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTgsICJGb3Jwcm9maXQiLCAiaWxsaWNpdF9kcnVndXNlIikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTksICJGb3Jwcm9maXQiLCAiaWxsaWNpdF9kcnVndXNlIikKCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE2LCAiRm9ycHJvZml0IiwgIm5lZWRpbmdfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNywgIkZvcnByb2ZpdCIsICJuZWVkaW5nX3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTgsICJGb3Jwcm9maXQiLCAibmVlZGluZ190eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE5LCAiRm9ycHJvZml0IiwgIm5lZWRpbmdfdHgiKQoKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTYsICJGb3Jwcm9maXQiLCAic3VkIikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTcsICJGb3Jwcm9maXQiLCAic3VkIikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTgsICJGb3Jwcm9maXQiLCAic3VkIikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTksICJGb3Jwcm9maXQiLCAic3VkIikKYGBgCmBgYHtyfQojZm9yIHByb2ZpdCB0cmVhdG1lbnQgY2VudGVycyBhcmUgaGVhdmlseSBza2V3ZWQgZm9yIGFsbCB5ZWFycwpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNiwgIkZvcnByb2ZpdCIsICJjb3VudF90eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE3LCAiRm9ycHJvZml0IiwgImNvdW50X3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTgsICJGb3Jwcm9maXQiLCAiY291bnRfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOSwgIkZvcnByb2ZpdCIsICJjb3VudF90eCIpCmBgYAoKYGBge3J9CiNub24gcHJvZml0IHRyZWF0bWVudCBjZW50ZXJzIGFyZSBoZWF2aWx5IHNrZXdlZCBmb3IgYWxsIHllYXJzCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE2LCAiTm9ucHJvZml0IiwgImNvdW50X3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTcsICJOb25wcm9maXQiLCAiY291bnRfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOCwgIk5vbnByb2ZpdCIsICJjb3VudF90eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE5LCAiTm9ucHJvZml0IiwgImNvdW50X3R4IikKYGBgCmBgYHtyfQojZ292ZXJubWVudCB0cmVhdG1lbnQgY2VudGVycyBhcmUgaGVhdmlseSBza2V3ZWQgZm9yIGFsbCB5ZWFycwpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNiwgIkdvdmVybm1lbnQiLCAiY291bnRfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNywgIkdvdmVybm1lbnQiLCAiY291bnRfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOCwgIkdvdmVybm1lbnQiLCAiY291bnRfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOSwgIkdvdmVybm1lbnQiLCAiY291bnRfdHgiKQpgYGAKCgoKSW52ZXN0aWdhdGluZyB0cmVhdG1lbnQgY2VudGVycyBwZXIgY2FwaXRhIG92ZXIgdGltZSBhbmQgYnkgcHJvZml0IHN0YXR1cwpgYGB7cn0KZm9ycHJvZml0X3R4cGVyY2FwaXRhIDwtIHN0YXRlX2ZpbmFsX2RmICU+JSAKICBmaWx0ZXIocHJvZml0X3R5cGUgPT0gIkZvcnByb2ZpdCIpICU+JSAKICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpemUoYXZnX3R4X3BlcmNhcGl0YSA9IG1lYW4odHhfcGVyY2FwaXRhLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtaW5fdHhfcGVyY2FwaXRhID0gbWluKHR4X3BlcmNhcGl0YSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWF4X3R4X3BlcmNhcGl0YSA9IG1heCh0eF9wZXJjYXBpdGEsIG5hLnJtID0gVFJVRSkpCiAgCm5vbnByb2ZpdF90eHBlcmNhcGl0YSA8LSBzdGF0ZV9maW5hbF9kZiAlPiUgCiAgZmlsdGVyKHByb2ZpdF90eXBlID09ICJOb25wcm9maXQiKSAlPiUgCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXplKGF2Z190eF9wZXJjYXBpdGEgPSBtZWFuKHR4X3BlcmNhcGl0YSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWluX3R4X3BlcmNhcGl0YSA9IG1pbih0eF9wZXJjYXBpdGEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1heF90eF9wZXJjYXBpdGEgPSBtYXgodHhfcGVyY2FwaXRhLCBuYS5ybSA9IFRSVUUpKQoKZ292dF90eHBlcmNhcGl0YSA8LSBzdGF0ZV9maW5hbF9kZiAlPiUgCiAgZmlsdGVyKHByb2ZpdF90eXBlID09ICJHb3Zlcm5tZW50IikgJT4lIAogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcml6ZShhdmdfdHhfcGVyY2FwaXRhID0gbWVhbih0eF9wZXJjYXBpdGEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1pbl90eF9wZXJjYXBpdGEgPSBtaW4odHhfcGVyY2FwaXRhLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtYXhfdHhfcGVyY2FwaXRhID0gbWF4KHR4X3BlcmNhcGl0YSwgbmEucm0gPSBUUlVFKSkKCgoKcGxvdChmb3Jwcm9maXRfdHhwZXJjYXBpdGEkeWVhciwgZm9ycHJvZml0X3R4cGVyY2FwaXRhJGF2Z190eF9wZXJjYXBpdGEsIHR5cGUgPSAnbycsIGNvbCA9ICdibHVlJywgeWxpbSA9IGMoMC4wMDAwMDEsIDAuMDAwMDUpKQojbGluZXMoZm9ycHJvZml0X3R4cGVyY2FwaXRhJHllYXIsIGZvcnByb2ZpdF90eHBlcmNhcGl0YSRtaW5fdHhfcGVyY2FwaXRhLCB0eXBlID0gJ2wnLCBjb2wgPSAnYmx1ZScsIGx0eSA9IDIpCiNsaW5lcyhmb3Jwcm9maXRfdHhwZXJjYXBpdGEkeWVhciwgZm9ycHJvZml0X3R4cGVyY2FwaXRhJG1heF90eF9wZXJjYXBpdGEsIHR5cGUgPSAnbCcsIGNvbCA9ICdibHVlJywgbHR5ID0gMikKCmxpbmVzKG5vbnByb2ZpdF90eHBlcmNhcGl0YSR5ZWFyLCBub25wcm9maXRfdHhwZXJjYXBpdGEkYXZnX3R4X3BlcmNhcGl0YSwgdHlwZSA9ICdvJywgY29sID0gJ3JlZCcgKQojbGluZXMobm9ucHJvZml0X3R4cGVyY2FwaXRhJHllYXIsIG5vbnByb2ZpdF90eHBlcmNhcGl0YSRtaW5fdHhfcGVyY2FwaXRhLCB0eXBlID0gJ2wnLCBjb2wgPSAncmVkJywgbHR5ID0gMiApCiNsaW5lcyhub25wcm9maXRfdHhwZXJjYXBpdGEkeWVhciwgbm9ucHJvZml0X3R4cGVyY2FwaXRhJG1heF90eF9wZXJjYXBpdGEsIHR5cGUgPSAnbCcsIGNvbCA9ICdyZWQnLCBsdHkgPSAyICkKCmxpbmVzKGdvdnRfdHhwZXJjYXBpdGEkeWVhciwgZ292dF90eHBlcmNhcGl0YSRhdmdfdHhfcGVyY2FwaXRhLCB0eXBlID0gJ28nLCBjb2wgPSAnZ3JlZW4nKQojbGluZXMoZ292dF90eHBlcmNhcGl0YSR5ZWFyLCBnb3Z0X3R4cGVyY2FwaXRhJG1pbl90eF9wZXJjYXBpdGEsIHR5cGUgPSAnbCcsIGNvbCA9ICdncmVlbicsIGx0eSA9IDIpCiNsaW5lcyhnb3Z0X3R4cGVyY2FwaXRhJHllYXIsIGdvdnRfdHhwZXJjYXBpdGEkbWF4X3R4X3BlcmNhcGl0YSwgdHlwZSA9ICdsJywgY29sID0gJ2dyZWVuJywgbHR5ID0gMikKCgpgYGAKYGBge3J9CnN0YXRlX2ZpbmFsX2RmW2lzLm5hKHN0YXRlX2ZpbmFsX2RmJHR4X3BlcmNhcGl0YSksXQpgYGAKCmBgYHtyfQojQ29ubmVjdGljdXQsIFNvdXRoIENhcm9saW5hLCBPaGlvLCBNaXNzaXNzaXBwaSwgTmV3IFlvcmsgaGF2ZSB0aGUgZmV3ZXN0IGZvci1wcm9maXQgdHJlYXRtZW50IGNlbnRlcnMgcGVyIGNhcGl0YQojTWFpbmUsIElkYWhvLCBVdGFoLCBOb3J0aCBEYWtvdGEsIEtlbnR1Y2t5IGhhdmUgdGhlIG1vc3QgZm9yLXByb2ZpdCB0cmVhdG1lbnQgY2VudGVycyBwZXIgY2FwaXRhIApzdGF0ZV9maW5hbF9kZiAlPiUKICBncm91cF9ieShTdGF0ZV9BYmJyZXYsIHByb2ZpdF90eXBlKSAlPiUKICBzdW1tYXJpemUoYXZnX3R4cGVyY2FwaXRhID0gbWVhbih0eF9wZXJjYXBpdGEsIG5hLnJtID0gVFJVRSkpICU+JQogIGZpbHRlcihwcm9maXRfdHlwZSA9PSAiRm9ycHJvZml0IikgJT4lCiAgYXJyYW5nZShhdmdfdHhwZXJjYXBpdGEpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBsZWZ0X2pvaW4oc3RhdGUsIGJ5ID0gYygiU3RhdGVfQWJicmV2IiA9ICJzdGF0ZV9hYmJyZXZzIikpICU+JQpnZ3Bsb3QoYWVzKHg9bG9uZywgeT1sYXQsIGZpbGw9IGF2Z190eHBlcmNhcGl0YSwgZ3JvdXA9Z3JvdXApKSArIAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleSIsIGhpZ2ggPSAiZ3JlZW4iLCBsaW1pdHMgPSBjKDAsMC4wMDAxKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUoJ0F2ZXJhZ2UgTm9ucHJvZml0IFRyZWF0bWVudCBDZW50ZXJzIHBlciBjYXBpdGEgMjAxNS0yMDE5JykgKyAKICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKDEuMykKYGBgCgpgYGB7cn0KI1ZpcmdpbmlhLCBUZXhhcywgSWRhaG8sIFNvdXRoIENhcm9saW5hLCBHZW9yZ2lhIGhhdmUgdGhlIGZld2VzdCBub24tcHJvZml0IHRyZWF0bWVudCBjZW50ZXJzIHBlciBjYXBpdGEKI0hhd2FpaSwgQWxhc2thLCBNYWluZSwgVmVybW9udCwgV3lvbWluZyBoYXZlIHRoZSBtb3N0IG5vbi1wcm9maXQgdHJlYXRtZW50IGNlbnRlcnMgcGVyIGNhcGl0YSAKc3RhdGVfZmluYWxfZGYgJT4lCiAgZ3JvdXBfYnkoU3RhdGVfQWJicmV2LCBwcm9maXRfdHlwZSkgJT4lCiAgc3VtbWFyaXplKGF2Z190eHBlcmNhcGl0YSA9IG1lYW4odHhfcGVyY2FwaXRhLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBmaWx0ZXIocHJvZml0X3R5cGUgPT0gIk5vbnByb2ZpdCIpICU+JQogIGFycmFuZ2UoYXZnX3R4cGVyY2FwaXRhKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbGVmdF9qb2luKHN0YXRlLCBieSA9IGMoIlN0YXRlX0FiYnJldiIgPSAic3RhdGVfYWJicmV2cyIpKSAlPiUKZ2dwbG90KGFlcyh4PWxvbmcsIHk9bGF0LCBmaWxsPSBhdmdfdHhwZXJjYXBpdGEsIGdyb3VwPWdyb3VwKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZXkiLCBoaWdoID0gImJsdWUiLCBsaW1pdHMgPSBjKDAsMC4wMDAxKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUoJ0F2ZXJhZ2UgTm9ucHJvZml0IFRyZWF0bWVudCBDZW50ZXJzIHBlciBjYXBpdGEgMjAxNS0yMDE5JykgKyAKICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKDEuMykKYGBgCgpgYGB7cn0KI05ldyBIYW1wc2hpcmUsIFRlbm5lc3NlZSwgUGVubnN5bHZhbmlhLCBEZWxhd2FyZSwgS2VudHVja3kgaGF2ZSB0aGUgZmV3ZXN0IGdvdmVybm1lbnQgdHJlYXRtZW50IGNlbnRlcnMgcGVyIGNhcGl0YQojQWxhc2thLCBOb3J0aCBEYWtvdGEsIFNvdXRoIERha290YSwgV3lvbWluZywgTmV3IE1leGljbyBoYXZlIHRoZSBtb3N0IGdvdmVybm1lbnQgdHJlYXRtZW50IGNlbnRlcnMgcGVyIGNhcGl0YSAKc3RhdGVfZmluYWxfZGYgJT4lCiAgZ3JvdXBfYnkoU3RhdGVfQWJicmV2LCBwcm9maXRfdHlwZSkgJT4lCiAgc3VtbWFyaXplKGF2Z190eHBlcmNhcGl0YSA9IG1lYW4odHhfcGVyY2FwaXRhLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBmaWx0ZXIocHJvZml0X3R5cGUgPT0gIkdvdmVybm1lbnQiKSAlPiUKICBhcnJhbmdlKGF2Z190eHBlcmNhcGl0YSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGxlZnRfam9pbihzdGF0ZSwgYnkgPSBjKCJTdGF0ZV9BYmJyZXYiID0gInN0YXRlX2FiYnJldnMiKSkgJT4lCmdncGxvdChhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gYXZnX3R4cGVyY2FwaXRhLCBncm91cD1ncm91cCkpICsgCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmV5IiwgaGlnaCA9ICJyZWQiLCBsaW1pdHMgPSBjKDAsMC4wMDAwNSkpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9seWdvbihjb2xvciA9ICJ3aGl0ZSIpICsgCiAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKCdBdmVyYWdlIGdvdmVybm1lbnQgVHJlYXRtZW50IENlbnRlcnMgcGVyIGNhcGl0YSAyMDE1LTIwMTknKSArIAogICAgICAgICAgICAgICAgICAgICAgY29vcmRfZml4ZWQoMS4zKQpgYGAKCmBgYHtyfQpzdGF0ZV9maW5hbF9kZiAlPiUKICBncm91cF9ieShTdGF0ZV9OYW1lLCBwcm9maXRfdHlwZSkgJT4lCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IGMoU3RhdGVfTmFtZSwgcHJvZml0X3R5cGUpLCBuYW1lc19mcm9tID0geWVhciwgdmFsdWVzX2Zyb20gPSBjb3VudF90eCwgbmFtZXNfcHJlZml4ID0gInlyIikgJT4lCiAgbXV0YXRlKGNoYW5nZV8yMDE2XzE3ID0geXIyMDE3IC0geXIyMDE2LAogICAgICAgICBjaGFuZ2VfMjAxN18xOCA9IHlyMjAxOCAtIHlyMjAxNywKICAgICAgICAgY2hhbmdlXzIwMThfMTkgPSB5cjIwMTkgLSB5cjIwMTgsIAogICAgICAgICB0b3RhbF9jaGFuZ2UgPSB5cjIwMTkgLSB5cjIwMTcpCiAgI211dGF0ZShpbmNyZWFzZSA9IGlmZWxzZSgpKQpgYGAKCmBgYHtyfQoKc3RhdGVfeWVhcmx5X2F2ZXJhZ2VzPC0gc3RhdGVfZmluYWxfZGYgJT4lCiAgZGlzdGluY3QoU3RhdGVfQWJicmV2LCBwcm9maXRfdHlwZSwgeWVhciwgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXplKGF2Z19kcnVndXNlID0gbWVhbihpbGxpY2l0X2RydWd1c2UpLAogICAgICAgICBhdmdfZHJpbmtpbmcgPSBtZWFuKGJpbmdlX2RyaW5raW5nKSwKICAgICAgICAgYXZnX29kID0gbWVhbihSQVRFKSkgJT4lCiAgYXJyYW5nZSh5ZWFyKQoKcGxvdChzdGF0ZV95ZWFybHlfYXZlcmFnZXMkeWVhciwgc3RhdGVfeWVhcmx5X2F2ZXJhZ2VzJGF2Z19kcnVndXNlLCB0eXBlID0gJ2wnKQpwbG90KHN0YXRlX3llYXJseV9hdmVyYWdlcyR5ZWFyLCBzdGF0ZV95ZWFybHlfYXZlcmFnZXMkYXZnX2RyaW5raW5nLCB0eXBlID0gJ2wnKQpwbG90KHN0YXRlX3llYXJseV9hdmVyYWdlcyRhdmdfb2QsIHN0YXRlX3llYXJseV9hdmVyYWdlcyRhdmdfb2QsIHR5cGUgPSAnbCcpCgpgYGAKCg==